package com.example.mycarcalling.activity;

import android.app.Application;
import android.content.Context;
import android.text.TextUtils;
import android.util.Log;

import com.baidu.mapapi.CoordType;
import com.baidu.mapapi.SDKInitializer;
import com.example.lib_cache.CacheApplication;
import com.example.lib_common.util.SpUtils;
import com.netease.nim.uikit.api.NimUIKit;
import com.netease.nimlib.sdk.NIMClient;
import com.netease.nimlib.sdk.SDKOptions;
import com.netease.nimlib.sdk.auth.LoginInfo;
import com.netease.nimlib.sdk.util.NIMUtil;

import java.lang.reflect.Method;

import dagger.hilt.android.HiltAndroidApp;

@HiltAndroidApp
public class DemoApplication extends Application {
    private CacheApplication moduleApplication;//module的Application映射

    @Override
    public void onCreate() {
        super.onCreate();

        //在使用SDK各组件之前初始化context信息，传入ApplicationContext
        SDKInitializer.initialize(this);
        Log.d("application:------------>  ","开始执行");
        //自4.3.0起，百度地图SDK所有接口均支持百度坐标和国测局坐标，用此方法设置您使用的坐标类型.
        //包括BD09LL和GCJ02两种坐标，默认是BD09LL坐标。
        SDKInitializer.setCoordType(CoordType.BD09LL);

        //网易云信

        // SDK初始化（启动后台服务，若已经存在用户登录信息， SDK 将进行自动登录）。不能对初始化语句添加进程判断逻辑。
        NIMClient.init(this, loginInfo(), options());

        // ... your codes

        // 使用 `NIMUtil` 类可以进行主进程判断。
        // boolean mainProcess = NIMUtil.isMainProcess(context)
        if (NIMUtil.isMainProcess(this)) {
            // 注意：以下操作必须在主进程中进行
            // 1、UI相关初始化操作
            // 2、相关Service调用

            //初始化UIKit
            NimUIKit.init(this);
        }

        //同步Module的Application的onCreate
        if (moduleApplication != null){
            moduleApplication.onCreate();//用于执行module的一些自定义初始化操作
        }
    }

//     如果提供，将同时进行自动登录。如果当前还没有登录用户，请传入null。详见自动登录章节。
    private LoginInfo loginInfo() {
        // 从本地读取上次登录成功时保存的用户登录信息
        String token = SpUtils.getString(this,"NIMPassengerToken");
        String account = SpUtils.getString(this,"NIMPassengerAccount");

        if (!TextUtils.isEmpty(account) && !TextUtils.isEmpty(token)) {

            return new LoginInfo(account, token);
        } else {
            return null;
        }
    }

//     设置初始化配置参数，如果返回值为 null，则全部使用默认参数。
    private SDKOptions options() {
        SDKOptions options = new SDKOptions();

        // 配置是否需要预下载附件缩略图，默认为 true
        options.preloadAttach = true;

        return options;
    }

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);

        moduleApplication = getModuleApplicationInstance(this);
        try {
            //通过反射调用moduleApplication的attach方法
            Method method = Application.class.getDeclaredMethod("attach", Context.class);
            if (method != null) {
                method.setAccessible(true);
                method.invoke(moduleApplication, getBaseContext());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //映射获取ModuleApplication
    private CacheApplication getModuleApplicationInstance(Context paramContext) {
        try {
            if (moduleApplication == null) {
                ClassLoader classLoader = paramContext.getClassLoader();
                if (classLoader != null) {
                    Class<?> mClass = classLoader.loadClass(CacheApplication.class.getName());
                    if (mClass != null)
                        moduleApplication = (CacheApplication) mClass.newInstance();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return moduleApplication;
    }

}
